package cn.tedu.shoot;
import javax.swing.*;
import java.awt.*;
import java.util.Random;
/** 飞行物 */
public abstract class FlyingObject {
    public static final int LIVE = 0;//活着的
    public static final int DEAD = 1;//死了的
    public static final int REMOVE = 2;//删除的
    public int state = LIVE;//默认是活着的

    protected int width;  //宽
    protected int height; //高
    protected int x;      //x坐标
    protected int y;      //y坐标

    /** 专门给小敌机、大敌机、小蜜蜂提供的 */
    //因为小敌机、大敌机、小蜜蜂的宽和高是不同的，意味着数据不能写死，所以传参
    //因为小敌机、大敌机、小蜜蜂的x和y是相同的，意味着数据可以写死
    public FlyingObject(int width,int height){
        this.width = width;
        this.height = height;
        Random rand = new Random(); //随机数对象
        x = rand.nextInt(World.WIDTH-width); //x:0到(窗口宽-敌人宽)之内的随机数
        y = height; //y:负的敌人的高
    }

    /** 专门给英雄机、天空、子弹提供的 */
    //因为英雄机、天空、子弹的宽/高/x/y都是不同的，意味着数据都不能写死，所以传参
    public FlyingObject(int width,int height,int x,int y){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
    }

    /** 飞行物移动 */
    public abstract void step();

    public boolean isLive(){ //判断飞行物是否活着的
        return state == LIVE;
    }

    public boolean isDead(){ //判断飞行物是否死了的
        return state == DEAD;
    }

    public boolean isRemove(){ //判断飞行物是否被删除的
        return state == REMOVE;
    }

    public abstract ImageIcon getImage();

    public void paintImage(Graphics g){
        if (this.isLive()){
            this.getImage().paintIcon(null,g,this.x,this.y);
        }
    }

    /** 检测敌人是否越界*/
    public boolean isOutOfBounds(){
        return y>=World.HEIGHT;//敌人的y大于窗口的高即为越界了
    }

    /** 检测碰撞 假设 this表示敌人  other表示子弹/英雄机*/
    public boolean isHit(FlyingObject other){
        int x1 = this.x-other.width;//x1 敌人的x-子弹/英雄机的宽
        int x2 = this.x+this.width;//x2 敌人的x+子弹/英雄机的宽
        int y1 = this.y-other.height;
        int y2 = this.y+this.height;
        int x = other.x;            //x 子弹/英雄机的x
        int y = other.y;
        return x>=x1 && x<=x2
                &&
                y>=y1 && y<=y2;//x在x1与x2之间并且 y在y1与y2之间 即为撞上了
    }

    /**飞行物去死*/
    public void goDead(){
        state = DEAD;
    }
}